package com.eiisan.security.util;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.eiisan.security.config.WebSecurityConfig;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.User;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

import javax.annotation.PostConstruct;
import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;
import java.util.Collection;
import java.util.Date;
import java.util.stream.Collectors;

/**
 * @author eii
 * @sice 2020/11/6
 */
@Slf4j
@Component
public class JWTTokenUtil {
//    /**
//     * 算法
//     */
//    private static Algorithm algorithm;
//    /**
//     * 签发者
//     */
//    private static String issuer;
//    /**
//     * 是否过期
//     */
//    private static boolean expired = false;
//    /**
//     * 过期时长(毫秒)
//     */
//    private static Long expiration;
//    /**
//     * 声明
//     */
//    private static String claim;
//    /**
//     * HttpHeader名称
//     */
//    private static String header;
//    /**
//     * token前缀
//     */
//    private static String tokenPrefix;
//    /**
//     * token前缀长度
//     */
//    private static int tokenPrefixLength;
//
//
//    /**
//     * 验证过期
//     */
//    private static JWTVerifier verifier;
//
//    /**
//     * 不验证过期
//     */
//    private static JWTVerifier expiredVerifier;
//
//
//
//    @PostConstruct
//    public void init() {
//
//        verifier = JWT.require(algorithm).withIssuer(issuer).build();
//        expiredVerifier = JWT.require(algorithm).acceptExpiresAt(0).withIssuer(issuer).build();
//    }
//
//    public String resolveToken(HttpServletRequest request) {
//        String bearerToken = request.getHeader(WebSecurityConfig.AUTHORIZATION_HEADER); //从HTTP头部获取TOKEN
//        if (StringUtils.hasText(bearerToken)) {
//            return resolveToken(bearerToken);
//        }
//        bearerToken = request.getHeader(WebSecurityConfig.AUTHORIZATION_TOKEN);        //从请求参数中获取TOKEN
//        if (StringUtils.hasText(bearerToken)) {
//            return resolveToken(bearerToken);
//        }
//        return null;
//    }
//
//    public String resolveToken(String bearerToken) {
//        if (StringUtils.hasText(bearerToken) && bearerToken.startsWith(WebSecurityConfig.TOKEN_PREFIX)) {
//            return bearerToken.substring(WebSecurityConfig.TOKEN_PREFIX.length());                              //返回Token字符串，去除Bearer
//        }
//        return null;
//    }
//
//    /**
//     * 基本builder
//     */
//    private static JWTCreator.Builder baseBuilder() {
//        long now = System.currentTimeMillis();
//        JWTCreator.Builder builder = JWT.create();
//        builder.withIssuer(issuer);
//        builder.withIssuedAt(new Date(now));
//        if (expired) {
//            builder.withExpiresAt(new Date(now + expiration));
//        }
//        return builder;
//    }
//
//    /**
//     * 生成token
//     */
//    public static String createToken(String username, String authorities) {
//        JWTCreator.Builder builder = baseBuilder();
//        builder.withSubject(username); // 设置面向用户
//        builder.withClaim(claim, authorities);// 添加权限属性
//        return builder.sign(algorithm);// 创建Token令牌
//    }
//
//    // 创建Token
//    public String createToken(Authentication authentication, Boolean rememberMe) {
//        String authorities = authentication.getAuthorities().stream() // 获取用户的权限字符串，如 USER,ADMIN
//                .map(GrantedAuthority::getAuthority)
//                .collect(Collectors.joining(","));
//        long now = (new Date()).getTime(); // 获取当前时间戳
//        Date validity; // 存放过期时间
//        if (rememberMe) {
//            validity = new Date(now + this.expiration);
//        } else {
//            validity = new Date(now + this.expiration);
//        }
//        return "";
//    }
//
//    public boolean validateToken(String token) {
//        DecodedJWT jwt ;
//        try {
//            // 前面已经将exp置为合适的过期时间了,这里只需要判断其是否超过当前时间即可.
//            jwt = expired ? expiredVerifier.verify(token) : verifier.verify(token);
//            return true;
//        } catch (Exception e){
//            log.info("Invalid JWT signature.");
//            log.trace("Invalid JWT trace: {}", e);
//            return false;
//        }
//    }
//
//    /**
//     * 获取用户权限
//     */
//    public Authentication getAuthentication(String token){
//        DecodedJWT jwt ;
//        try {
//            // 前面已经将exp置为合适的过期时间了,这里只需要判断其是否超过当前时间即可.
//            jwt = expired ? expiredVerifier.verify(token) : verifier.verify(token);
//        } catch (Exception e){
//            log.info("Invalid JWT signature.");
//            log.trace("Invalid JWT trace: {}", e);
//            return null;
//        }
//        Collection<? extends GrantedAuthority> authorities = Arrays
//                .stream(jwt.getClaim(claim).asString().split(","))// 获取用户权限字符串
//                .map(SimpleGrantedAuthority::new).collect(Collectors.toList());// 将元素转换为GrantedAuthority接口集合
//        User principal = new User(jwt.getSubject(), "", authorities);
//        return new UsernamePasswordAuthenticationToken(principal, "", authorities);
//    }

}
